#ifndef QLSPLUGINSMANAGER_H
#define QLSPLUGINSMANAGER_H

#include <QObject>
#include <QList>
#include <QPluginLoader>
#include <QString>

#include "dllQLsPluginsManager_global.h"
#include "qlsinterface.h"
#include "../../DevBase/dllQLsThemesManager/qlsthemesmanager.h"

/* 插件信息类 */
class DLLQLSPLUGINSMANAGER_EXPORT PluginInfo
{
public:
	QPluginLoader *m_loader;			/* 插件 */
	QLsInterface *m_interface;			/* 接口 */
	InterfaceInfo *m_interfaceInfo;		/* 接口信息(除了窗口) */
	QString m_absFilename;				/* 绝对路径 */
	QString m_filename;					/* 文件名 */
	bool m_isLoaded;					/* 是否加载 */

	/* 构造函数 */
	PluginInfo();
	/* 运算符重载 == */
	bool operator ==(const PluginInfo &other);
	/* 运算符重载 >> */
	QList<PluginInfo> &operator >>(QList<PluginInfo> &list);
};

/* 插件管理类 */
class DLLQLSPLUGINSMANAGER_EXPORT QLsPluginsManager
{
public:
	QLsPluginsManager(QString pluginsDir = "plugins/QCoreSystem");
	~QLsPluginsManager();

	/* 运算符重载 == */
	bool operator ==(const QLsPluginsManager &other);

	/* 插件路径 */
	QString pluginsDir() const;
	void setPluginsDir(const QString &pluginsDir);

	/* 插件信息配置文件路径 */
	QString pluginsIniDir() const;

	/* 更新本地插件：只获取信息，不直接加载 */
	void RefreshLocalPlugins();

	/* 加载插件 */
	bool LoadPlugin(PluginInfo &info);
	bool LoadPlugin(const QString &filename);

	/* 获取已加载插件列表 */
	QList<PluginInfo> GetPluginsList() const;

	/* 卸载全部插件 */
	void UnloadAllPlugin();

	/* 卸载插件 */
	bool UnloadPlugin(PluginInfo &info);
	bool UnloadPluginByFilename(const QString &filename);
	bool UnloadPluginByAbsFilename(const QString &absFilename);

	/* 根据插件名获取插件信息 */
	PluginInfo GetPluginInfoByInterfaceName(const QString &interfaceName);

	/* 检查必装插件是否加载 */
	bool CheckMustLoadPlugins();
	QStringList mustLoadButDisload() const;

	/* 主题管理系统 */
	QLsThemesManager *themesManager() const;

private:
	QLsThemesManager *m_themesManager;				/* 主题管理系统 */

	QString m_pluginsDir;							/* 插件路径 */
	QString m_pluginsIniDir;						/* 插件信息配置文件路径 */

	QList<PluginInfo> m_pluginsList;				/* 插件列表 */
	QStringList m_mustLoadButDisload;				/* 未装的必装插件 */
};

#endif // QLSPLUGINSMANAGER_H
